
//链表节点
class Node{
    constructor(val=""){
        this.val=val;
        this.next=null;
    }
}

class LinkList{
    constructor(){
        this.size=0;
        this.head=null;
    }

    //添加节点
    append(node){
        let cur=this.head;
        if(this.head==null){
            this.head=node;
        }else{
            while(cur.next!=null){
                cur=cur.next;
            }
            cur.next=node;
        }
       this.size++;

    }

    //在某个位置后面添加节点
    appendAt(node,index){
        this.checkRange(index);

        let cur=this.head;
        for (let i = 0; i < this.size; i++) { 
            if(i==index){
                // const temp=cur.next;
                node.next=cur.next;
                cur.next=node;
                this.size++;
                break;
            }else{
                cur=cur.next;
            } 
        }
    }

    //在某个位置前面添加节点
    prependAt(node,index){
       this.checkRange(index);
        let cur=this.head;
        for (let i = 0; i < this.size; i++) {
            if(i==index){
                node.next=cur;//链表保存到节点的下个节点
                this.head=node;//把头指向节点
                this.size++;
                break;
            }else{
                cur=cur.next;
            } 
        }
    }

    //删除最后一个节点
    removeLast(){
        //方法1：
        // let cur=this.head;
        // let pre=this.head;
        // while(cur.next!=null){
        //     pre=cur;
        //     cur=cur.next;
        // }
        // pre.next=null;

        //方法2：
        if(this.size==1){
            this.clear();
        }else if(this.size>1){
            let last=this.getNodeAt(this.size-2);
            last.next=null;
        }
        

        
    }

    //删除最先一个节点
    removeFirst(){
        this.head=this.head.next;
        this.size--;
    }

    //在某个位置删除节点
    removeAt(index){
        this.checkRange(index);

        if(index==0){
            
            this.removeFirst();
        }else{
            let pre=this.getNodeAt(index-1);
            const cur=pre.next;
            pre.next=cur.next;
            this.size--;
        }
        // for (let i = 0; i < this.size; i++) {
        //     if(i==index-1){
        //         const temp=cur.next;
        //         this.head=temp;
        //         this.size--;
        //         break;
        //     }else if(){

        //     }else{
        //         pre=cur;
        //         cur=cur.next;
        //     } 
        // }
    }
    clear(){
        this.head=null;
        this.size=0;
    }

    indexOf(Node){

    }

    getNodeAt(index){
        this.checkRange(index);
        let cur=this.head;
        for (let i = 0; i < this.size; i++) {
            if(i==index){
                return cur;
            }else{
                cur=cur.next;
            }
                 
        }
    }
    
    checkRange(index){
        if(index<0||index>=this.size){
            throw new Error("index out of range");
        }
    }


}



let ll=new LinkList();
ll.append(new Node("first"));
for (let index = 0; index < 6; index++) {
    const a=new Node(index);
    ll.append(a);
}
ll.append(new Node("last"));
console.dir(ll,{depth:100});

//ll.appendAt(new Node("kevin"),0);
//ll.prependAt(new Node("henry"),0);
ll.removeAt(0);
 //ll.removeAt(7);

console.dir(ll,{depth:100})